/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.rcn.util;

import com.google.common.base.Strings;
import com.rcn.dal.hibernate.GestorHibernateDAO;
import com.rcn.domain.Medico;
import com.rcn.domain.Paciente;
import com.rcn.exception.RaccoonException;
import com.rcn.hibernate.GestorBD;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.ListModel;

/**
 *
 * @author Nicolas
 */
public class UIHelper {
    private static UIHelper uiHelper;
    
    private UIHelper(){
       
    }
    
    public static UIHelper getInstance(){
        if(uiHelper==null){
            uiHelper=new UIHelper();
        }
        return uiHelper;
    }
    
    /**
     * Carga en el Jlist una lista de pacientes.
     */
    public void cargarListaPacientes(JList lstPacientes, List<Paciente> listaPacientes) throws RaccoonException{
        try{
            if(listaPacientes!=null ){
                JList jList=new JList(listaPacientes.toArray());
                lstPacientes.setModel(jList.getModel());
            }           
        }catch(Exception e){
            throw new RaccoonException(e.getMessage(), e);
        }
    }
    
    /**
     * Carga en el Jlist una lista de pacientes.
     */
    public void cargarListaMedicos(JList lstMedicos, List<Medico> listaMedicos) throws RaccoonException{
        try{
            if(listaMedicos!=null ){
                JList jList=new JList(listaMedicos.toArray());
                lstMedicos.setModel(jList.getModel());
            }           
        }catch(Exception e){
            throw new RaccoonException(e.getMessage(), e);
        }
    }
    
    /**
     * Crea un Paciente a partir del que esta seleccionado en la lista
     * @return Paciente
     */
    public Paciente getPacienteFromList(JList lstPacientes){
        int index=lstPacientes.getSelectedIndex();
        ListModel model=lstPacientes.getModel();
        Paciente pacienteSeleccionado=null;
        try{
            pacienteSeleccionado=(Paciente)model.getElementAt(index);
        }catch(ClassCastException e){
            //No hago nada, es cuando hace click en ningun item de la lista
        }
        return pacienteSeleccionado;
    }
    
    public Medico getMedicoFromList(JList lstMedicos){
        int index=lstMedicos.getSelectedIndex();
        ListModel model=lstMedicos.getModel();
        Medico medicoSeleccionado=null;
        try{
            medicoSeleccionado=(Medico)model.getElementAt(index);
        }catch(ClassCastException e){
            //No hago nada, es cuando hace click en ningun item de la lista
        }
        return medicoSeleccionado;
    }
    
    /**
     * Retorna el indice de un paciente en un JList
     * @param lstPacientes
     * @param paciente
     * @return 
     */
    public int getPacienteIndex(JList lstPacientes,Paciente paciente){
        if(paciente!=null){
            if(lstPacientes!=null){
                ListModel model=lstPacientes.getModel();
                for(int i=0;i<model.getSize();i++){
                    if(paciente.equals(model.getElementAt(i))){
                        return i;
                    }
                }
            }
        }
        return -1;
    }
    
    /**
     * Elimina el paciente seleccionado de la base de datos y de la variable listaPacientes
     * @param lstPacientes
     * @param listaPacientes 
     */
    public void eliminarPaciente(JList lstPacientes,List<Paciente> listaPacientes) throws RaccoonException, RaccoonException{
        Paciente paciente=getPacienteFromList(lstPacientes);
        GestorHibernateDAO.getInstance().getPacienteDAO().delete(paciente);
        listaPacientes.remove(paciente);
    }
    
    /**
     * Elimina el medico seleccionado de la base de datos y de la variable listamedicos
     * @param lstMedicos
     * @param listaMedicos 
     */
    public void eliminarMedico(JList lstMedicos,List<Medico> listaMedicos) throws RaccoonException{
        Medico medico=getMedicoFromList(lstMedicos);
        GestorHibernateDAO.getInstance().getMedicoDAO().delete(medico);
        listaMedicos.remove(medico);
    }
    
    /**
     * @param txtDate String which contains the date to validate.
     * @return Return a valid date or null if the String is null or empty
     * @throws RaccoonException 
     */
    public Date getValidDate(String txtDate) throws RaccoonException{
        if(!Strings.isNullOrEmpty(txtDate)){
            try {
                SimpleDateFormat df = new SimpleDateFormat("dd/MM/yy");
                df.setLenient(false);
                Date date = df.parse(txtDate);
                return date;
            } catch (ParseException ex) {
               throw new RaccoonException("Fecha Invalida: "+txtDate, ex);
            }
        }
        return null;
    }
    
    public List<Paciente> filtrarListaPacientes(List<Paciente> lista,String filtro){
        List<Paciente> listaFiltrada=new ArrayList(lista);
        if(lista!=null){
            for(int i=0;i<lista.size();i++){
                Paciente pac=lista.get(i);
                if( !pac.getApellido().toLowerCase().contains(filtro)
                   && !pac.getNombre().toLowerCase().contains(filtro)
                   && !isDniMatches(pac,filtro)){
                    listaFiltrada.remove(pac);
                }
            }
        }
        return listaFiltrada;
    }
    
    public List<Medico> filtrarListaMedico(List<Medico> lista,String filtro){
        List<Medico> listaFiltrada=new ArrayList(lista);
        if(lista!=null){
            for(int i=0;i<lista.size();i++){
                Medico med=lista.get(i);
                if( !med.getApellido().toLowerCase().contains(filtro)
                   && !med.getNombre().toLowerCase().contains(filtro)){
                    listaFiltrada.remove(med);
                }
            }
        }
        return listaFiltrada;
    }
    
    /**
     * Chequea si el filtro coincide con el dni del paciente.
     * 
     * @param pac
     * @param filtro
     * @return 
     *  false: Cuando el filtro no es nro
     *  false: Cuando el dni del paciente no comienza con el nro del filtro.
     *  true: si coincide
     */
    private boolean isDniMatches(Paciente pac,String filtro){
        boolean match=false;
        try{
            Integer dniFiltro=Integer.parseInt(filtro);
            Integer dniPac=pac.getNroDocumento();
            if(dniPac.toString().startsWith(dniFiltro.toString())){
                match=true;
            }
        }catch(NumberFormatException e){
            //do nothing
        }
        return match;
    }
}
